/** 
* Copyright (C) 2012-2017 ZEEI Inc.All Rights Reserved.
* 项目名称：common
* 文件名称：StringUtil.java
* 包  名 称：com.zeei.common.utils
* 文件描述：String工具类
* 创建日期：2017年8月3日上午9:39:11
* 
* 修改历史
* 1.0 zhouweisheng 2017年8月3日上午9:39:11 创建文件
*
*/
package com.zeei.ems.base.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @类型名称：StringUtil 
 * @类型描述：String工具类
 * @功能描述：提供String工具方法 
 * @创建作者：zhouweisheng
 */
public class StringUtil {
	private static final Logger LOGGER = LoggerFactory.getLogger(StringUtil.class);
	private StringUtil(){
		
	}
	
	/**默认的分隔符*/
	public static final String DEFAULT_SEPARATOR_REGEX=",";
	/**
	 * 
	 * isEmptyOrNull:判断字符串是否为空或者空格
	 *
	 * @param str
	 * @return boolean
	 */
	public static boolean isEmptyOrNull(String str) {
		return str == null || str.length() <= 0;
	}
	
	/**
	 * 判断String是否为空
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(String str) {
		return str == null || "".equals(str.trim());
	}

	/**
	 * 判断String不为空
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNotEmpty(String str) {
		return !isEmpty(str);
	}

	/**
	 * 如果String是空的话用默认值代替
	 * 
	 * @param str
	 * @param defaultValue
	 * @return
	 */
	public static String valueOf(String str, String defaultValue) {
		return isEmpty(str) ? defaultValue : str;
	}

	/**
	 * 方法描述：如果Object是null的话用默认值代替
	 * 
	 * @param obj
	 * @param defaultValue
	 * @return
	 */
	public static String valueOf(Object obj, String defaultValue) {
		String str = (obj == null ? null : obj.toString());
		return valueOf(str, defaultValue);
	}

	/**
	 * 方法描述：如果Object是null的话用默认值代替
	 * 
	 * @param obj
	 * @return
	 */
	public static String valueOf(Object obj) {
		String str = (obj == null ? null : obj.toString());
		return valueOf(str, "--");
	}

	/**
	 * 方法描述：将string解析成int值
	 * 
	 * @param str
	 * @return
	 */
	public static int parseInt(String str) {
		return parseInt(str, 0);
	}

	/**
	 * 方法描述：将String解析成int值，如果String为空，则用默认值
	 * 
	 * @param str
	 * @param defaultValue
	 * @return
	 */
	public static int parseInt(String str, Object defaultValue) {
		if (isEmpty(str)) {
			return Integer.parseInt(String.valueOf(defaultValue));
		}
		return Integer.parseInt(str);
	}

	/**
	 * 方法描述：String的trim方法加判null处理
	 * 
	 * @param str
	 * @return
	 */
	public static String trim(String str) {
		return str == null ? null : str.trim();
	}

	/**
	 * 方法描述：获取字符串""
	 * 
	 * @return 返回""
	 */
	public static String empty() {
		return StringUtils.EMPTY;
	}

	/**
	 * 方法描述：字符串去除\r\n空格
	 * 
	 * @return 返回
	 */
	public static String replaceBlank(String str) {
		Pattern p = Pattern.compile("\\s*|\t|\r|\n");
		Matcher m = p.matcher(str);
		str = m.replaceAll("");
		return str;
	}

	/**
	 * 方法描述:将字符窗按照默认的分隔符(,)拆分成list
	 *
	 * @param str
	 * @return
	 */
	public static List<String> splitToList(String str) {
		return splitToList(str, DEFAULT_SEPARATOR_REGEX);
	}
	
	/**
	 * 
	 * splitStrToList:字符串转换为整型集合，字符换是逗号隔开的
	 * 
	 * @param str 逗号隔开的字符串
	 * @return List<Integer> 整型集合
	 */
	public static List<Integer> splitStrToList(String str){
		List<String> list = splitToList(str); 
	    return strListToIntegerList(list);
	}
	
	/**
	 * 
	 * strListToIntegerList:字符串集合转换为整体集合
	 * 
	 * @param strList 字符串集合
	 * @return List<Integer> 整体集合
	 */
	public static List<Integer> strListToIntegerList(List<String> strList){
		List<Integer> list = new ArrayList<>();
		if (CollectionUtils.isNotEmpty(strList)){
		    for(int i=0; i<strList.size(); i++){
		    	if(!StringUtil.isEmpty(strList.get(i))){
		    		list.add(Integer.parseInt(strList.get(i)));
		    	}
		    }
		}
	    
	   return list;
	}
	
	/**
	 * 
	 * splitStrArrToList:字符串数组转换为字符串集合
	 * 
	 * @param strArr 字符串数组
	 * @return List<String> 字符串集合
	 */
	public static List<String> splitStrArrToList(String[] strArr){
		List<String> list = new ArrayList<>();
		if (strArr != null && strArr.length > 0){
			for(String val : strArr){
				list.add(val);
			}
		}
		
		return list;
	}

	/**
	 * 方法描述:将字符串按照指定的分隔符(正则)拆分成list
	 *
	 * @param str
	 * @param regex
	 * @return
	 */
	public static List<String> splitToList(String str, String regex) {
		List<String> list = new ArrayList<>();
		if (isNotEmpty(str)) {
			String[] strArr = str.split(regex);
			list = Arrays.asList(strArr);
		}
		return list;
	}
	
	/**
	 * 
	 * listToString:List数据拼接成字符串
	 * 
	 * @param list
	 * @return String
	 */
	@SuppressWarnings("rawtypes")
	public static String listToString(List list) {
        StringBuilder sb = new StringBuilder();
        if (CollectionUtils.isNotEmpty(list)) {
            for (int i = 0; i < list.size(); i++) {
                if (i < list.size() - 1) {
                    sb.append(list.get(i) + ",");
                } else {
                    sb.append(list.get(i));
                }
            }
        }
        return sb.toString();
    }
	
	public static String convertUTF8(String val){
		String strValue = StringUtil.empty();
		try{
			strValue = new String(val.getBytes("ISO8859-1"), "utf-8");
		}catch(Exception e){
			LOGGER.error(String.format("StringUtil.convertUTF8:%s", e));
		}
		
		return strValue;
	}
	


	/**
	 * 判断是否是数字
	 */
	public static boolean strIsNumeric(String str) {
		Pattern pattern = Pattern.compile("-?[0-9]+\\.?[0-9]*");
		Matcher isNum = pattern.matcher(str); // matcher是全匹配
		if (!isNum.matches()) {
			return false;
		}
		return true;
	}

	/**
	 * 移除站点编号字符串中的非数字站点编号
	 */
	public static List<String> removePointCodeStrContainsStr(String pointCodeStr) {
		List<String> listStr = StringUtil.splitToList(pointCodeStr);
		List<String> arrList = new ArrayList<String>(listStr);
		List<String> returnList = new ArrayList<String>();
		for (int i = 0; i < arrList.size(); i++) {
			String pointStr = arrList.get(i);
			if (strIsNumeric(pointStr)) {
				returnList.add(pointStr);
			}
		}
		return returnList;
	}
	
	/**
	 * 移除字符串中非数值字符并转为Double类型
	 */
	public static List<Double> removeAndConverStrDouble(String pointCodeStr) {
		List<String> listStr = StringUtil.splitToList(pointCodeStr);
		List<String> arrList = new ArrayList<String>(listStr);
		List<Double> returnList = new ArrayList<Double>();
		for (int i = 0; i < arrList.size(); i++) {
			String pointStr = arrList.get(i);
			if (strIsNumeric(pointStr)) {
				returnList.add(Double.parseDouble(pointStr));
			}
		}
		return returnList;
	}
	
	
	/**
	 * 移除字符串中非数值字符并转为Double类型
	 */
	public static List<Double> converListStrToDouble(List<String> listStr) {
		List<String> arrList = new ArrayList<String>(listStr);
		List<Double> returnList = new ArrayList<Double>();
		for (int i = 0; i < arrList.size(); i++) {
			String pointStr = arrList.get(i);
			if (strIsNumeric(pointStr)) {
				returnList.add(Double.parseDouble(pointStr));
			}
		}
		return returnList;
	}

	/**
	 * 移除站点编号字符串中的非数字站点编号
	 */
	public static String removePointCodeStr(List<String> listStr) {
		StringBuffer strBuf = new StringBuffer();
		if (CollectionUtils.isNotEmpty(listStr)) {
			listStr.stream().forEach(str -> {
				strBuf.append(str).append(",");
			});
			String strTemp = strBuf.toString();
			return strTemp.substring(0, strTemp.length() - 1);
		}
		return null;
	}



	

}